package zero.tech.games.mj.data.entity;

import java.util.ArrayList;
import java.util.List;

import zero.tech.games.logic.common.Room;
import zero.tech.games.mj.util.GameUtils;
import zero.tech.wsnet.controller.LogicController;

/**
 * 房间玩家数据
 * @author ludry
 *
 */
public class PlayerData {
	/** 玩家uid */
	private int uid;
	/** 玩家昵称 */
	private String nick = "";
	/** 玩家总分 */
	private long gold = 0;
	/** 玩家底分 */
	private int diFen = 2;
	/** 是否胡牌 */
	private boolean isWin = false;
	/** 是否可出牌 */
	private boolean isOut = false;
	/** 是否补杠 */
	private boolean isBuGang = false;
	/** 翻数 */
	private int fanNum = 0;
	/** 每局赢 */
	private long win = 0;
	/** 每局输 */
	private long lose = 0;
	/** 当前的翻数 */
	private int fanCount = 0;
	/** 玩家操作锁 */
	private boolean isLock = false;
	/** 玩家胡的顺序 */
	private int huSort = -1;
	/** 当局是否点炮 */
	private boolean isDianPao = false;
	/** 玩家打出的牌 */
	private List<Integer> outCard = new ArrayList<Integer>();
	/** 玩家手牌 */
	private List<Integer> handCard = new ArrayList<Integer>();
	/** 玩家已操作的牌 */
	private List<String> ctrlCard = new ArrayList<String>();
	/** 临时处理碰牌 */
	private List<Integer> tmpArr = new ArrayList<Integer>();
	/** 临时处理杠牌 */
	private List<Integer> tmpGangArr = new ArrayList<Integer>();
	/** 玩家杠牌统计(玩家ID,玩家ID_积分) */
	private List<String> gangArr = new ArrayList<String>();
	/** 玩家等待的操作(1碰,2杠,3胡) */
	private List<String> actionArr = new ArrayList<String>();
	/** 胡牌后输钱的玩家 */
	private List<Integer> loseArr = new ArrayList<Integer>();
	/** pass过的牌 */
	private List<Integer> passArr = new ArrayList<Integer>();
	/** 胡的牌 */
	private List<Integer> huCards = new ArrayList<Integer>();
	/** 玩家手中可以杠的牌 */
	private List<String> glist = new ArrayList<String>();
	/** 记录特殊的胡法，杠上花，杠上炮，抢杠 */
	private String spHuStr = "";
	/** 当前摸的牌 */
	private int currCard = 0;
	/** 7自摸4接炮,0未胡,11查大叫 12花猪 */
	private int huType = 0;
	/** 胡牌字符串信息 */
	private String huStr = "";
	private String winTypeStr = "";
	/** 小结算 杠信息 */
	private String gangStr = "";
	/** 中码次数 */
	private int zhongMa = 0;

	/**
	 * 初始化玩家
	 * @param uid
	 * @param nick
	 */
	public PlayerData(int uid, String nick) {
		this.uid = uid;
		this.nick = nick;
	}
	
	/**
	 * 获取LogicController
	 * @param room
	 * @return
	 */
	public LogicController getController(Room room) {
        return room.getAllControllers().get(uid);
    }
	
	public void addCtrlCard(String value) {
		if (ctrlCard.indexOf(value) == -1) {
			ctrlCard.add(value);
		}
	}

	/**
	 * 为手牌增加一张牌
	 * 
	 * @param card
	 */
	public void addHandlCard(int card) {
		handCard.add(card);
	}

	/**
	 * 加番
	 * 
	 * @param value
	 */
	public void addFan(int value) {
		setFanNum(getFanNum() + value);
	}

	/**
	 * 删除手牌中的一张牌
	 * 
	 * @param card
	 */
	public void removeHandCard(int card) {
		for (int i = 0; i < handCard.size(); i++) {
			if ((int) handCard.get(i) == card) {
				handCard.remove(i);
				break;
			}
		}
	}

	/**
	 * 删除手牌中的多张牌
	 * 
	 * @param card
	 */
	public void removeHandCard(List<Integer> list) {
		for (int j = 0; j < list.size(); j++) {
			removeHandCard(list.get(j));
		}
	}

	/**
	 * 删除打出去的牌
	 * 
	 * @param card
	 */
	public void removeOutCard(int card) {
		for (int i = 0; i < outCard.size(); i++) {
			if ((int) outCard.get(i) == card) {
				outCard.remove(i);
			}
		}
	}

	/**
	 * @return 翻数
	 */
	public int getFanNum() {
		return fanNum;
	}

	/**
	 * @param fanNum
	 *            翻数
	 */
	public void setFanNum(int fanNum) {
		this.fanNum = fanNum;
	}

	/**
	 * 增加一张玩家打出的牌
	 * 
	 * @param card
	 */
	public void addOutCard(int card) {
		boolean isTrue = true;
		for (int i = 0; i < outCard.size(); i++) {
			if (outCard.get(i) == card) {
				isTrue = false;
			}
		}
		if (isTrue) {
			if (outCard.indexOf(card) == -1) {
				outCard.add(card);
			}
		}
	}

	/**
	 * @return 玩家打出的牌
	 */
	public List<Integer> getOutCard() {
		return outCard;
	}

	/**
	 * @param outCard
	 *            玩家打出的牌
	 */
	public void setOutCard(List<Integer> outCard) {
		this.outCard = outCard;
	}

	/**
	 * @return 玩家手牌
	 */
	public List<Integer> getHandCard() {
		return handCard;
	}

	/**
	 * @param handCard
	 *            玩家手牌
	 */
	public void setHandCard(List<Integer> handCard) {
		this.handCard = handCard;
	}

	/**
	 * @return 玩家已操作的牌(说明如下) <li>牌,牌,牌_类型_玩家ID <li>2碰,3明杠,4胡,5暗杠,6点杠
	 */
	public List<String> getCtrlCard() {
		return ctrlCard;
	}

	/**
	 * @param ctrlCard
	 *            玩家已操作的牌
	 */
	public void setCtrlCard(List<String> ctrlCard) {
		this.ctrlCard = ctrlCard;
	}

	/**
	 * @return 是否胡牌
	 */
	public boolean isWin() {
		return isWin;
	}

	/**
	 * @param isWin
	 *            是否胡牌
	 */
	public void setWin(boolean isWin) {
		this.isWin = isWin;
	}

	/**
	 * @return 当前摸的牌
	 */
	public int getCurrCard() {
		return currCard;
	}

	/**
	 * @param currCard
	 *            当前摸的牌
	 */
	public void setCurrCard(int currCard) {
		this.currCard = currCard;
	}

	/**
	 * @return 临时处理碰牌
	 */
	public List<Integer> getTmpArr() {
		return tmpArr;
	}

	/**
	 * @param tmpArr
	 *            临时处理碰牌
	 */
	public void setTmpArr(List<Integer> tmpArr) {
		this.tmpArr = tmpArr;
	}

	/**
	 * @return 临时处理杠牌
	 */
	public List<Integer> getTmpGangArr() {
		return tmpGangArr;
	}

	/**
	 * @param tmpGangArr
	 *            临时处理杠牌
	 */
	public void setTmpGangArr(List<Integer> tmpGangArr) {
		this.tmpGangArr = tmpGangArr;
	}

	/**
	 * @return 玩家等待的操作(1碰,2杠,3胡)
	 */
	public List<String> getActionArr() {
		return actionArr;
	}

	/**
	 * 初始化
	 */
	public void initActionArr() {
		setActionArr(new ArrayList<String>());
	}

	/**
	 * @param actionArr
	 *            玩家等待的操作(1碰,2杠,3胡)
	 */
	public void setActionArr(List<String> actionArr) {
		this.actionArr = actionArr;
	}

	/**
	 * @return 7自摸4接炮,0未胡,11查大叫 12花猪
	 */
	public int getHuType() {
		return huType;
	}

	/**
	 * @param huType
	 *            7自摸4接炮,0未胡,11查大叫,12花猪
	 */
	public void setHuType(int huType) {
		this.huType = huType;
	}

	/**
	 * @return 是否可出牌
	 */
	public boolean isOut() {
		return isOut;
	}

	/**
	 * @param isOut
	 *            是否可出牌
	 */
	public void setOut(boolean isOut) {
		this.isOut = isOut;
	}

	public void addGangStr(String str) {
		if (!str.equals("") && gangArr.indexOf(str) == -1) {
			gangArr.add(str);
		}
	}

	/**
	 * 删除玩家自己的杠
	 * 
	 * @return
	 */
	public String removeGangLast() {
		String str = getGangArr().remove(getGangArr().size() - 1);
		return str;
	}

	/**
	 * 删除最后一个杠
	 */
	public String removeGangLast(int uid) {
		String str = "";
		if (getGangArr().size() > 0) {
			String str1 = getGangArr().remove(getGangArr().size() - 1);
			String[] ids = str1.split(",");
			for (int i = 0; i < ids.length - 3; i++) {
				int id = GameUtils.getInteger(ids[i]);
				if (id != uid) {
					str += id + ",";
				}
			}
			if (str.length() > 0) {
				str += ids[ids.length - 3] + "," + ids[ids.length - 2] + ","
						+ ids[ids.length - 1];
			}
		}
		return str;
	}

	/**
	 * @return 玩家杠牌统计(玩家ID,玩家ID_积分)
	 */
	public List<String> getGangArr() {
		return gangArr;
	}

	/**
	 * @param gangArr
	 *            玩家杠牌统计(玩家ID,玩家ID_积分)
	 */
	public void setGangArr(List<String> gangArr) {
		this.gangArr = gangArr;
	}

	/**
	 * 每局赢
	 * @return win
	 */
	public long getWin() {
		return win;
	}

	/**
	 * @param win
	 *            要设置的每局赢
	 */
	public void setWin(long win) {
		this.win = win;
	}

	/**
	 * 每局输
	 * @return lose
	 */
	public long getLose() {
		return lose;
	}

	/**
	 * @param lose
	 *            要设置的每局输
	 */
	public void setLose(long lose) {
		this.lose = lose;
	}

	/**
	 * @return loseArr 胡牌后输钱的玩家
	 */
	public List<Integer> getLoseArr() {
		return loseArr;
	}

	/**
	 * @param loseArr
	 *            胡牌后输钱的玩家
	 */
	public void setLoseArr(List<Integer> loseArr) {
		this.loseArr = loseArr;
	}

	/**
	 * @return 胡牌字符串信息
	 */
	public String getHuStr() {
		return huStr;
	}

	/**
	 * @param huStr
	 *            要设置的 huStr
	 */
	public void setHuStr(String huStr) {
		this.huStr = huStr;
	}

	/**
	 * @return winTypeStr
	 */
	public String getWinTypeStr() {
		return winTypeStr;
	}

	/**
	 * @param winTypeStr
	 *            要设置的 winTypeStr
	 */
	public void setWinTypeStr(String winTypeStr) {
		this.winTypeStr = winTypeStr;
	}

	/**
	 * @return pass过的牌
	 */
	public List<Integer> getPassArr() {
		return passArr;
	}

	/**
	 * @param passArr
	 *            pass过的牌
	 */
	public void setPassArr(List<Integer> passArr) {
		this.passArr = passArr;
	}

	/**
	 * @return 玩家操作锁
	 */
	public boolean isLock() {
		return isLock;
	}

	/**
	 * @param isLock
	 *            玩家操作锁
	 */
	public void setLock(boolean isLock) {
		this.isLock = isLock;
	}

	/**
	 * @return glist 玩家手中可以杠的牌
	 */
	public List<String> getGlist() {
		return glist;
	}

	/**
	 * @param glist
	 *            玩家手中可以杠的牌
	 */
	public void setGlist(List<String> glist) {
		this.glist = glist;
	}

	/**
	 * @return 是否补杠（补杠是不算收入的）
	 */
	public boolean isBuGang() {
		return isBuGang;
	}

	/**
	 * @param isBuGang
	 *            是否明杠（补杠是不算收入的）
	 */
	public void setBuGang(boolean isBuGang) {
		this.isBuGang = isBuGang;
	}

	/**
	 * @return 胡牌的翻数
	 */
	public int getFanCount() {
		return fanCount;
	}

	/**
	 * @param fanCount
	 *            胡牌的翻数
	 */
	public void setFanCount(int fanCount) {
		this.fanCount = fanCount;
	}

	/** 玩家胡牌的顺序 */
	public int getHuSort() {
		return huSort;
	}

	/** 玩家胡牌的顺序 */
	public void setHuSort(int huSort) {
		this.huSort = huSort;
	}

	/** 记录特殊的胡，杠上花，杠上炮 */
	public String getSpHuStr() {
		return spHuStr;
	}

	/** 记录特殊的胡，杠上花，杠上炮 */
	public void setSpHuStr(String spHuStr) {
		this.spHuStr = spHuStr;
	}

	@Override
	public String toString() {
		return "ControllerData [uid=" + uid + ", nick=" + nick  + ", gold=" + gold
				+ ", isWin=" + isWin + ", isOut=" + isOut + ", isBuGang=" + isBuGang
				+ ", fanNum=" + fanNum + ", win=" + win + ", lose=" + lose
				+ ", fanCount=" + fanCount
				+ ", isLock=" + isLock + ", huSort=" + huSort + ", outCard=" + outCard + ", handCard=" + handCard
				+ ", ctrlCard=" + ctrlCard 
				+ ", tmpArr=" + tmpArr
				+ ", tmpGangArr=" + tmpGangArr + ", gangArr=" + gangArr
				+ ", actionArr=" + actionArr + ", loseArr=" + loseArr
				+ ", passArr=" + passArr + ", huCards=" + huCards + ", glist="
				+ glist + ", spHuStr=" + spHuStr
				+ ", currCard=" + currCard + ", winType=" 
				+ huType + ", huStr=" + huStr + ", winTypeStr="
				+ winTypeStr + "]";
	}
	
	/**
	 * 玩家uid
	 * @return
	 */
	public int getUid() {
		return uid;
	}

	/**
	 * 玩家uid
	 * @param uid
	 */
	public void setUid(int uid) {
		this.uid = uid;
	}

	/**
	 * 玩家昵称
	 * @return
	 */
	public String getNick() {
		return nick;
	}

	/**
	 * 玩家昵称
	 * @param nick
	 */
	public void setNick(String nick) {
		this.nick = nick;
	}

	/**
	 * 胡的牌
	 * @return
	 */
	public List<Integer> getHuCards() {
		return huCards;
	}

	/**
	 * 胡的牌
	 * @param huCards
	 */
	public void setHuCards(List<Integer> huCards) {
		this.huCards = huCards;
	}

	/**
	 * 玩家总分
	 * @return
	 */
	public long getGold() {
		return gold;
	}

	/**
	 * 玩家总分
	 * @param gold
	 */
	public void setGold(long gold) {
		this.gold = gold;
	}

	/**
	 * 小结算 杠信息
	 * @return
	 */
	public String getGangStr() {
		return gangStr;
	}

	/**
	 * 小结算 杠信息
	 * @param gangStr
	 */
	public void setGangStr(String gangStr) {
		this.gangStr = gangStr;
	}

	/**
	 * 中码次数
	 * @return
	 */
	public int getZhongMa() {
		return zhongMa;
	}

	/**
	 * 中码次数
	 * @param zhongMa
	 */
	public void setZhongMa(int zhongMa) {
		this.zhongMa = zhongMa;
	}

	/**
	 * 玩家底分
	 * @return
	 */
	public int getDiFen() {
		return diFen;
	}

	/**
	 * 玩家底分
	 * @param diFen
	 */
	public void setDiFen(int diFen) {
		this.diFen = diFen;
	}

	/**
	 * 当局是否点炮
	 * @return
	 */
	public boolean isDianPao() {
		return isDianPao;
	}

	/**
	 * 当局是否点炮
	 * @param isDianPao
	 */
	public void setDianPao(boolean isDianPao) {
		this.isDianPao = isDianPao;
	}
	

}
